// process.env.TS_NODE_PROJECT = 'tsconfig.node.json' // 指定配置
/**
 * 执行 JavaScript 脚本的工作子进程
 * 使用 vm 模块创建一个沙盒环境来执行脚本
 * 该子进程会监听主进程发送的消息，执行脚本并将结果返回给主进程
 * 该子进程会在主进程退出时自动退出
 * 该子进程会在执行脚本时捕获错误并将错误信息返回给主进程
 */
import vm from 'vm'
import { createRequire } from 'module'
import { log } from 'console'
import { ScriptCommand } from './scriptEngine'
// 允许的安全模块（防止恶意代码访问敏感系统资源）
const ALLOWED_MODULES = new Set(['lodash', 'moment', 'axios']) // 这里可以添加更多允许的模块
import * as mathLab from './mathLab'
import * as kxdLab from './kxdLab'
// 日志消息的主体结构
function createLogMessage(level: 'INFO' | 'WARN' | 'ERROR', message: string, extra?: any) {
  return {
    level,
    logger: `进程[${process.pid}] ${message}`,
    timestamp: new Date().toISOString(),
    pid: process.pid,
    ...(extra && { extra }),
  }
}
// 创建 require 方法（限定只能加载 `node_modules` 内的安全模块）
const safeRequire = (moduleName) => {
  if (!ALLOWED_MODULES.has(moduleName)) {
    throw new Error(`❌ 访问受限：模块 "${moduleName}" 不在允许的列表中`)
  }
  return createRequire(import.meta.url)(moduleName)
}

log('worker process start, safeRequire:', safeRequire)
let state = 'idle'

// 监听主进程发送的代码
process.on('message', (msg: ScriptCommand) => {
  log('execute msg=>:', msg)
  if (msg.command === 'execute') {
    if (state === 'busy') {
      process.send?.({ error: '❌ 代码执行中，请稍后再试' })
      return
    }
    state = 'busy'
    try {
      // 创建沙盒环境，注入 console 和受限的 require
      const sandbox = {
        console,
        require: safeRequire, // 仅允许加载安全模块
        mathlab: mathLab,
        kxdlab: kxdLab,
        result: null
      }
      vm.createContext(sandbox)
      // 在沙盒中执行代码
      sandbox.result = vm.runInContext(msg.script!, sandbox)

      log('execute result=>:', sandbox)
      // 发送执行结果给主进程
      process.send?.({
        success: true,
        output: sandbox.result,
        command: 'log',
        log: createLogMessage('INFO', '脚本执行成功', { 
          resultLength: typeof sandbox.result === 'string' 
            ? sandbox.result.length 
            : undefined 
        })
      });
    } catch (err) {
      log('execute error=>:', err)
      process.send?.({
        success: false,
        error: err instanceof Error ? err.message : '' + err,
        command: 'log',
        log: createLogMessage('ERROR', `脚本执行失败`, {
          error: err.message,
        })
      })
    }
    state = 'idle'
  } else if (msg.command === 'exit') {
    log('exit msg=>:', msg)
    process.exit(0)
  } else if (msg.command === 'state') {
    log('state msg=>:', msg)
    process.send?.({ state })
  }
})

// // setInterval(() => {}, 1000); // 每秒执行一次空函数，保持事件循环

// // 监听主进程消息
// process.on('message', (msg) => {
//   console.log('来自主进程的消息:', msg);
//   // 回复消息
//   if (process.send) {
//     process.send({ child: 'Hello from child process!' });
//   }
// });

// // 示例：发送欢迎消息
// if (process.send) {
//   process.send({ child: 'Child process started!' });
// }
